package org.freehep.util.commanddispatcher.test;
import java.awt.Dimension;
import java.beans.PropertyVetoException;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import org.freehep.swing.test.TestFrame;
import org.freehep.util.commanddispatcher.CommandProcessor;
import org.freehep.util.commanddispatcher.CommandSourceAdapter;
import org.freehep.util.commanddispatcher.CommandTargetManager;
/**
* This class illustrates the use of CommandProcessors in a simple
* MDI application. There are three classes of command processors
* in this sample application.
* <ol>
* <li>The MDICommandProcessor in the main class, which is always
* active and deals with creating new windows, and exiting the application.
* <li>The PageCommandProcessor in each page, which is active only
* when its page is the selected page.
* <li>The PrintingPageCommandProcessor, which extends PageCommandProcessor
* and provides support for the print command in PrintablePages.
* </ol>
*/
public class MDITest extends TestFrame
{
private CommandTargetManager manager;
private JDesktopPane desktop;
public void addToMenuBar(JMenuBar bar)
{
manager = new CommandTargetManager();
manager.add(new MDICommandProcessor());
bar.add(new FileMenu());
manager.start();
}
public JComponent createComponent()
{
desktop = new JDesktopPane();
desktop.setPreferredSize(new Dimension(600, 400));
return desktop;
}
public static void main(String[] argv)
{
new MDITest();
}
public class MDICommandProcessor extends CommandProcessor
{
public void onExit()
{
quit();
}
public void onNewNonPrintablePage()
{
JInternalFrame f = new NonPrintablePage(manager);
desktop.add(f);
f.setVisible(true);
}
public void onNewPrintablePage()
{
JInternalFrame f = new PrintablePage(manager);
desktop.add(f);
f.setVisible(true);
}
public void onDump()
{
manager.dump(System.out);
}
}
class FileMenu extends JMenu
{
FileMenu()
{
super("File");
add("New Printable Page");
add("New Non Printable Page");
add("Close");
addSeparator();
add("Print");
addSeparator();
add("Dump");
addSeparator();
add("Exit");
}
public JMenuItem add(String name)
{
JMenuItem item = new JMenuItem(name);
manager.add(new CommandSourceAdapter(item));
super.add(item);
return item;
}
}
}
class PrintablePage extends NonPrintablePage
{
PrintablePage(CommandTargetManager manager)
{
super("Printable", manager);
}
protected CommandProcessor createCommandProcessor()
{
return new PrintingPageCommandProcessor();
}
public class PrintingPageCommandProcessor extends PageCommandProcessor
{
public void onPrint()
{
System.out.println("Print!");
}
}
}
class NonPrintablePage extends JInternalFrame
{
private CommandProcessor pageCommandProcessor = createCommandProcessor();
private CommandTargetManager manager;
NonPrintablePage(CommandTargetManager manager)
{
this("Non-printable", manager);
}
NonPrintablePage(String title, CommandTargetManager manager)
{
super(title);
this.manager = manager;
setSize(300, 300);
}
public void setSelected(boolean isSelected) throws PropertyVetoException
{
super.setSelected(isSelected);
if (isSelected)
manager.add(pageCommandProcessor);
else
manager.remove(pageCommandProcessor);
}
protected CommandProcessor createCommandProcessor()
{
return new PageCommandProcessor();
}
public class PageCommandProcessor extends CommandProcessor
{
public void onClose()
{
dispose();
}
}
}